package com.kenliang.toolslib.rxjava;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;

/**
 * @author KenLiang
 * @description:
 *
 * onCompleted(): 事件队列完结。RxJava 不仅把每个事件单独处理，还会把它们看做一个队列。RxJava 规定，当不会再有新的 onNext() 发出时，需要触发 onCompleted() 方法作为标志。
 * onError(): 事件队列异常。在事件处理过程中出异常时，onError() 会被触发，同时队列自动终止，不允许再有事件发出。
 * 在一个正确运行的事件序列中, onCompleted() 和 onError() 有且只有一个，并且是事件序列中的最后一个。需要注意的是，onCompleted() 和 onError() 二者也是互斥的，即在队列中调用了其中一个，就不应该再调用另一个。
 *
 * Observer 即观察者，它决定事件触发的时候将有怎样的行为。
 * Observable 即被观察者，它决定什么时候触发事件以及触发怎样的事件。
 * 1、ObservableEmitter： Emitter是发射器的意思，那就很好猜了，这个就是用来发出事件的，它可以发出三种类型的事件，通过调用emitter的onNext(T value)、onComplete()和onError(Throwable error)就可以分别发出next事件、complete事件和error事件
 * 但是，请注意，并不意味着你可以随意乱七八糟发射事件，需要满足一定的规则：
 *
 * 上游可以发送无限个onNext, 下游也可以接收无限个onNext.
 * 当上游发送了一个onComplete后, 上游onComplete之后的事件将会继续发送, 而下游收到onComplete事件之后将不再继续接收事件.
 * 当上游发送了一个onError后, 上游onError之后的事件将继续发送, 而下游收到onError事件之后将不再继续接收事件.
 * 上游可以不发送onComplete或onError.
 * 最为关键的是onComplete和onError必须唯一并且互斥, 即不能发多个onComplete, 也不能发多个onError, 也不能先发一个onComplete, 然后再发一个onError, 反之亦然
 *
 *
 * @date Created in 10:38 AM 2019/4/26.
 */
public class RxJavaTest {

    public static void main(String[] args) {
        RxJavaTest.test();

    }


    public static void test(){

        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {
                d.dispose();
            }

            @Override
            public void onNext(String s) {
                System.out.println("next:"+s);
//                throw new RuntimeException("onNext() error");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError():"+e.getMessage());
//                e.printStackTrace();
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete()");
            }
        };

        Observable<String> observable = Observable.create((emitter)->{
            emitter.onNext("two");
            emitter.onNext("three");
//            emitter.onError(new Exception("error"));
            emitter.onComplete();
            emitter.onComplete();



            emitter.onNext("first");


        });


        observable.subscribe(observer);
    }
}
